package com.luxsoft.siipap.em.replica.model;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * Representa un registro de datos en el sistema de replica
 * de siipap (DBF)
 * 
 * @author Ruben Cancino
 *
 */
public class Registro {
	
	private String origen;
	private String archivo;
	private Tipo tipo;
	private String llave;
	private String[] indices;
	private int indiceUso;
	private Set<Campo> campos;
	private String tempo1;
	private String alias;
	private String tipoArchivo;
	private int year;
		
	public static enum Tipo{
		ALTA,BAJA,CAMBIO
	}

	
	public String getOrigen() {
		return origen;
	}
	public void setOrigen(String origen) {
		this.origen = origen;
	}
	public String getAlias() {
		return alias;
	}
	public void setAlias(String alias) {
		this.alias = alias;
	}

	public String getArchivo() {
		return archivo;
	}
	public void setArchivo(String archivo) {
		this.archivo = archivo;
	}
	
	public String getClaveDeReplicacion(){
		if(getTipoArchivo().equalsIgnoreCase("F")){
			String name=StringUtils.substring(this.archivo,0,6);
			return name;
		}
		return getArchivo();
	}

	public Set<Campo> getCampos() {
		return campos;
	}
	public void setCampos(Set<Campo> campos) {
		this.campos = campos;
	}

	public String[] getIndices() {
		return indices;
	}
	public void setIndices(String[] indices) {
		this.indices = indices;
	}

	public int getIndiceUso() {
		return indiceUso;
	}
	public void setIndiceUso(int indiceUso) {
		this.indiceUso = indiceUso;
	}

	public String getLlave() {
		return llave;
	}
	public void setLlave(String llave) {
		this.llave = llave;
	}

	public String getTempo1() {
		return tempo1;
	}
	public void setTempo1(String tempo1) {
		this.tempo1 = tempo1;
	}

	public Tipo getTipo() {
		return tipo;
	}
	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}
	public void setTipo(final String tipo){
		if("A".equalsIgnoreCase(tipo)){
			setTipo(Tipo.ALTA);
		}else if("B".equalsIgnoreCase(tipo)){
			setTipo(Tipo.BAJA);
		}else if("C".equalsIgnoreCase(tipo)){
			setTipo(Tipo.CAMBIO);
		}
	}

	public String getTipoArchivo() {
		return tipoArchivo;
	}
	public void setTipoArchivo(String tipoArchivo) {
		this.tipoArchivo = tipoArchivo;
	}

	public int getYear() {
		return year;
	}
	public void setYear(int year) {
		this.year = year;
	}
	
	/**
	 * Busca el valor de un campo dentro de la coleccion de campos
	 * 
	 * @param campo
	 * @return El valor o nulo si el campo no existe o no tiene valor
	 */
	public Object buscarValor(final String campo){
		Campo c=(Campo)CollectionUtils.find(campos, new Predicate(){
			public boolean evaluate(Object arg0) {
				Campo c=(Campo)arg0;
				return campo.trim().equalsIgnoreCase(c.getNombre().trim());
			}
		});
		if(c!=null)
			return c.getValor();
		return null;
	}
	
	public String getString(final String campo){
		return toString(buscarValor(campo));
	}
	
	public Number getNumber(final String campo){
		return toBigDecimal(buscarValor(campo));
	}
	
	public BigDecimal getBigDecimal(final String campo){
		return toBigDecimal(buscarValor(campo));
	}
	
	public Date getDate(final String campo){
		return toDate(buscarValor(campo));
	}
	
	public String toString(Object data) {
		if (data != null)
			return data.toString().trim();
		return "";
	}

	public BigDecimal toBigDecimal(Object data) {
		if (data != null) {
			return new BigDecimal(data.toString());
		}
		return BigDecimal.ZERO;

	}
	
	public Double getDouble(String campo){
		Number data=getNumber(campo);
		return new Double(data.doubleValue());
	}
	
	public DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

	public Date toDate(Object data) {		
		if (data != null) {
			try {
				return df.parse(data.toString());
			} catch (ParseException e) {
				e.printStackTrace();
				return null;
			}
		}
		return null;
	}
	
	public String toString(){
		return new ToStringBuilder(this,ToStringStyle.SIMPLE_STYLE)
		.append(getArchivo())
		.append(getTipo())
		.append(getLlave())
		.append("Indices:" +getIndices().length)
		.append("Idx uso:" +getIndiceUso())
		.append("Campos: "+getCampos())
		.append(getYear())
		.append(getTipoArchivo())
		.append(getAlias())
		.append(getTempo1())
		.toString();
	
	}
	
	/** Propiedades particulares ***/
	
	public Object getSaldoDeArticulo(){
		if(getArchivo().startsWith("ARSALD")){
			Campo res=(Campo)CollectionUtils.find(getCampos(), new Predicate(){

				public boolean evaluate(Object arg0) {
					Campo campo=(Campo)arg0;
					return campo.getNombre().equals("SASALDACT");
				}
				
			});
			return res!=null?res.getValor():null;
		}
		return null;
		
	}
	
	public Object getSucursalArsald(){
		if(getArchivo().startsWith("ARSALD")){
			if(!StringUtils.isBlank(getLlave())){
				return StringUtils.substring(llave, 0, 3);
			}
		}
		return null;
	}
	
	public Object getProductoArsald(){
		if(getArchivo().startsWith("ARSALD")){
			if(!StringUtils.isBlank(getLlave())){
				return StringUtils.substring(llave, 3);
			}
		}
		return null;
	}
}
